     BOI.2. (MasterMind). Intre calculator si tine se joaca urmatorul joc:
Tu te gndesti la o secventa de 4 culori (nu neaparat distincte) alese dintr-o
multime de sase culori posibile.
Calculatorul (programul tau) trebuie sa afle aceasta secventa folosind informatia
pe care o poate extrage din raspunsul obtinut la ntrebari de tipul 
                                  Secventa este.. ?
Tu vei raspunde la ntrebarile calculatorului dupa fiecare secventa nou generata.
Raspunsul la o ntrebare a calculatorului contine doua parti:
a) Cte culori sunt corecte dar nu sunt asezate pe pozitiile lor;
b) Cte culori sunt asezate pe pozitiile corecte.
Exemplu: Sa presupunem ca secventa cautata este 4655. Un mod posibil de a afla
aceasta secventa este:
           Intrebarea calculatorului                Raspunsul tau
                             1 2 3 4                a) 1b) 0
                               5 1 5 6              a) 2b) 1
                               6 1 6 5              a) 1b) 1
                               5 6 2 5              a) 1b) 2
                               5 6 5 3              a) 1b) 2
                               4 6 5 5              a) 0b) 4
1) Aflati o secventa corecta de ntrebari pentru a rezolva problema;
2) Aflati, daca este posibil, o solutie n maxim 6 ntreb[ri.
================================================
          BOI 2 (Vlad Atanasiu):
           Programul a fost construit folosind comentarii care l fac usor de nteles.
program go;
uses crt;
type varianta = record
                culori:array[1..5] of byte;
                negre,albe:byte;
                end;
     raspunsuri = record
                  numar:byte;
                  variante:array[1..10] of varianta;
                  end;
var v_:varianta;
    r_:raspunsuri;
    i:integer;
---------------------------------------------------------
procedure next(var v_:varianta); 
{ intoarce in v_ urmatoarea combinatie posibila. Avansarea se
face prin numararea in baza 6 cu cifrele 1-6 in loc de 0-5. In
momentul cand a 5-a cifra s-a modificat, inseamna ca toate
variantele pe 4 cifre au fost acoperite (1111-6666) }
var i:integer;
begin
   inc(v_.culori[1]);
   for i:=1 to 4 do
     if v_.culori[i]>6 then
        begin
          v_.culori[i]:=1; inc(v_.culori[i+1]);
        end;
  if v_.culori[5]=2 then
     begin
       writeln('EROARE !!! '); halt(1);
{ daca s-a ajuns la ultima varianta posibila fara sa se
   gaseasca o solutie semnaleaza eroare }
     end;
end;
------------------------------------------------------------
function acopera(v1,v2:varianta):boolean;
{ v1 este varianta care trebuie incercata, v2 este varianta care
se testeaza daca indeplineste conditiile cu v1 ca solutie }
var i,j,negre,albe:byte;
begin
   negre:=0; albe:=0;
   for i:=1 to 4 do 
    if v1.culori[i]=v2.culori[i] then
     begin inc(negre); v2.culori[i]:=0; v1.culori[i]:=0; end;
   if negre=v2.negre then
      for i:=1 to 4 do
        for j:=1 to 4 do
          if (v2.culori[j]=v1.culori[i]) and
              (v2.culori[j]<>0) then
             begin
          inc(albe); v2.culori[j]:=0; v1.culori[i]:=0;
             end;
   acopera:=(negre=v2.negre) and (albe=v2.albe);
{ intoarce True daca varianta curenta este acoperita de cele
analizate anterior. }
end;
---------------------------------------------------------
procedure ask_and_add(v1:varianta);
{ afiseaza varianta v1 (prima varianta gasita care indeplineste
conditiile puse de raspunsurile la variantele anterioare) si
intreaba datele despre ea }
var i:integer;
begin
   inc(r_.numar); r_.variante[r_.numar]:=v1;
   write('varianta mea : ');
   for i:=1 to 4 do write(v1.culori[i],' ');
   write('a) '); readln(r_.variante[r_.numar].negre);
   gotoxy(37,wherey-1);
   write('b) '); read(r_.variante[r_.numar].albe);
end;
---------------------------------------------------------
function merge(v_:varianta):boolean;
{ intoarce True daca varianta curenta ar trebui sa fie intrebata
ca urmatoare solutie }
var i,j:integer;
    m:boolean;
begin
   m:=true; i:=1;
   while (i<=r_.numar) and m do
---------------------------------------------------------
      begin
        m:=acopera(v_,r_.variante[i]); inc(i);
      end;
   merge:=m;
end;
---------------------------------------------------------
begin {Program principal }
   clrscr; r_.numar:=0;
   for i:=1 to 5 do v_.culori[i]:=1; 
{initializeaza prima varianta posibila la 1111 }
   writeln('Alegeti o secventa de 4 cifre');
   while (r_.variante[r_.numar].negre<>4)or(r_.numar=0) do
      begin
        while not(merge(v_)) do next(v_); 
{trece la urmatoarea varianta posibila pana cand gaseste una
care ar trebui intrebata ca urmatoare solutie }
        ask_and_add(v_); {si o intreaba }
      end;
end.
--------------------------------------
